
function cookie_clear(key) {
    document.cookie = key + '=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;';
    }
  function cookie_read(key) {
    // 获取cookie字符串
    var cookieStr = document.cookie;
    
    // 拆分cookie字符串，得到键值对数组
    var cookieArr = cookieStr.split(";");
    
    // 遍历数组，查找指定键的cookie
    for (var i = 0; i < cookieArr.length; i++) {
    var cookiePair = cookieArr[i].split("=");
    if (cookiePair[0].trim() === key) {
    // 找到指定键的cookie，返回其值
    return decodeURIComponent(cookiePair[1]);
    }
    }
    
    // 未找到指定键的cookie，返回null
    return null;
    }
    
    function cookie_write(key, value, days) {
    // 设置cookie，有效期为指定天数之后的当前时间
    var expiryDate = new Date();
    expiryDate.setDate(expiryDate.getDate() + days);
    document.cookie = key + "=" + encodeURIComponent(value) + "; expires=" + expiryDate.toUTCString();
    }
window.lhp_loop_time=1000
window.lhp_loop_time_funcs={}
window.lhp_loop_time_obj=null
window.lhp_loop_time_func=function(){
  clearTimeout(lhp_loop_time_obj);//清除定时器
  for (let key in lhp_loop_time_funcs){
    let item=lhp_loop_time_funcs[key];
    if (item.now_time==null){item.now_time=0;}
    if (item.now_time>item.time){
      item.now_time=0;
      item.func()
    }else{item.now_time++}
  }
  lhp_loop_time_obj = setTimeout(lhp_loop_time_func, 1000); //设定定时器，循环运行
}
lhp_loop_time_obj = setTimeout(lhp_loop_time_func, 1000); //开始运行
// let lhp_loop_time_funcs___test_func=function(){console.log('test')}
// let lhp_loop_time_funcs___test={
//   'key':{'time':2,//两秒执行一次
//           'func':lhp_loop_time_funcs___test_func
//         },
// }
// window.lhp_loop_time_funcs=lhp_loop_time_funcs___test
// 原生js 加载css
// 存储加载过的CSS URL
window.cssjssrc={
    loadedCSS :[],
    loadedScripts : []
    }
    
    // 动态加载CSS
    function loadCSS(url) {
    url = url.replace(/\\/g, '/');  
    url="http://" +  window.location.hostname + ":" + window.location.port + url;  
    // 检查URL是否已加载
    if (cssjssrc.loadedCSS.includes(url)) {
        // CSS已加载，无需重新加载
        return;
    }
    
    // 创建新的link元素并设置属性
    var link = document.createElement('link');
    link.type = 'text/css';
    link.rel = 'stylesheet';
    link.href = url;
    
    // 插入新的link元素到页面的头部
    document.getElementsByTagName('head')[0].appendChild(link);
    
    // 将URL添加到loadedCSS对象中
    cssjssrc.loadedCSS.push(url);
    }
                // // 使用该函数加载CSS
                // loadCSS('path/to/your.css');
    //原生js 加载js
            // 存储加载过的JavaScript URL
            // 动态加载JavaScript
    function loadScript(url) {
    
    url = url.replace(/\\/g, '/');  
    url="http://" +  window.location.hostname + ":" + window.location.port + url;  
    // console.log('#######',cssjssrc.loadedScripts)
    // console.log('#######',url)
    
    // 检查URL是否已加载
    if (cssjssrc.loadedScripts.includes(url)) {
        // JavaScript已加载，无需重新加载
        return;
    }
    
    // 创建新的script元素并设置属性
    var script = document.createElement('script');
    script.type = 'text/javascript';
    script.src = url;
    
    // 插入新的script元素到页面的尾部
    document.body.appendChild(script);
    
    // 将URL添加到loadedScripts对象中
    cssjssrc.loadedScripts.push(url);
    }
    function loadcssjs(url){
        if (url.endsWith('.js')){loadScript(url)}else{loadCSS(url)}
    }
    
function getLoadedResources() {  
    // 初始化 JavaScript src 数组  
    var jsSrcs = [];  
    // 初始化 CSS src 数组  
    var cssSrcs = [];  
    // 获取所有已加载的 script 元素  
    var scriptElements = document.querySelectorAll('script');  
    // 遍历所有已加载的 script 元素  
    for (var i = 0; i < scriptElements.length; i++) {  
      // 将 script 元素的 src 属性值添加到 JavaScript src 数组中  
      jsSrcs.push(scriptElements[i].src);  
    }  
    // 获取所有已加载的 link 元素，并筛选出 rel 属性为 stylesheet 的元素  
    var stylesheetElements = document.querySelectorAll('link[rel="stylesheet"]');  
    // 遍历所有已加载的 stylesheet 元素  
    for (var i = 0; i < stylesheetElements.length; i++) {  
      // 将 stylesheet 元素的 href 属性值添加到 CSS src 数组中  
      cssSrcs.push(stylesheetElements[i].href); 
    }  
    // 返回包含 JavaScript src 和 CSS src 的对象  
    return {  
      loadedScripts: jsSrcs,  
      loadedCSS: cssSrcs  
    };  
  }
  document.addEventListener('DOMContentLoaded', function() {  
  
    // DOM已完全加载和解析，现在可以执行需要的操作  
    window.cssjssrc=  getLoadedResources()
  
  });
function request______(js_obj){
    //js_obj.method       请求格式是get 还是post  还是put  还是delete
    var method =js_obj.method;
    var onerror= js_obj.onerror ? js_obj.onerror!=null : function(){}
    var onnetworkerror= js_obj.onnetworkerror ? js_obj.onnetworkerror!=null : function(){}
    let url_ = js_obj.url;
    return function(js_obj2){
        //js_obj2.head_data    存放在url上的json数据
        //js_obj2.body_data    存放在body上的json数据
        //js_obj2.url          url
        let head_data=js_obj2.head_data;
        let body_data=js_obj2.body_data;
        if (head_data!=null){
          head_data.request_val=cookie_read('request_val')||'{}'
        
        }
        if (body_data!=null){
          body_data.request_val=cookie_read('request_val')||'{}'
        }
        // console.log('method:',method)
        // console.log('head_data:',head_data)
        // console.log('body_data:',body_data)
        // console.log(' ')
        let execute_lst=js_obj2.execute_lst;
        let url=url_;
        if (url==null){throw new Error('不能缺少url参数');}//缺少url就抛出异常
        if (head_data!=null){url=url+'?'+JSON.stringify(head_data)}//如果head_data不为空  就将head_data转为json格式存入url
        if (js_obj2.body_data!=null &&(method.toLowerCase()=='post' ||method.toLowerCase()=='put'  )){body_data=JSON.stringify(body_data)}else{body_data="{}"}//如果为post 或者 put 将body_data转为json格式
        let xhr = new XMLHttpRequest();
        xhr.open(method, url, true);
        xhr.onload = function() {
      if (xhr.status === 200) {
        // 请求成功，将返回的 JSON 数据解析为对象，并传递给回调函数
        // console.log('xhr.responseText',xhr.responseText)
        // console.log('typeof',typeof xhr.responseText,xhr.responseText)
        var received_data = JSON.parse(xhr.responseText);
        if (received_data.type=='error'){
          Vue.prototype.$notify({type: 'error',message: received_data.message||'错误'})
          return null
        }
        if (execute_lst==null)execute_lst=[]
        for (let i=0;i<execute_lst.length;i++){
            let item=execute_lst[i];
            // console.log(`######execute_lst[${i}]`,execute_lst)
            
            if (item.type=='func'){//运行函数
              let temp_func=item.func//传递进来的函数
              if (temp_func==null)continue;
              let args=  item.args;     
              // console.log('###args1###',args)
              let kwargs=  item.kwargs;      
              if (args==null){args=[]}    
              if (kwargs==null){kwargs={}}
              // console.log('###args2###',args)
              // args=['44','44']
              // kwargs={'ww':44,'ee':33}
              // 我要将args=的数组索引和kwargs的属性 统一存入temp_idx数组中 temp_idx格式为[['args',0],['args',1],['kwargs','ww'],['kwargs','ee']]
              // 你可以使用JavaScript的Object.keys()和Array.prototype.map()方法来获取kwargs的键和args的索引
              let temp_idx =[]
              for (let eee=0;eee<args.length;eee++){
                temp_idx.push(['args', eee])
              }
              temp_idx=temp_idx.concat(Object.keys(kwargs).map(key => ['kwargs', key])); 
              // console.log('###args3###',args)
              for (let ii_args=0;ii_args<temp_idx.length;ii_args++){
                      let iitem=temp_idx[ii_args];//['args',1]  ['kwargs','ee']
                      let data___=null;
                      let temp_iitem=null
                      if (iitem[0]=='args'){temp_iitem=args[iitem[1]]}else{temp_iitem=kwargs[iitem[1]]}
                      // console.log('temp_iitem',temp_iitem)
                      // console.log('Array.isArray(temp_iitem)',Array.isArray(temp_iitem))
                      // console.log('temp_iitem',temp_iitem)
                      if (typeof temp_iitem === 'string'){
                        data___=received_data;           //获取变量地址
                        // console.log('str!!!',data___,received_data)
                        let temp_lst=temp_iitem.split('.');          //拆分数组
                        let last_name=temp_lst[temp_lst.length-1];//最后一个变量的名字
                        for (let ii=0;ii<temp_lst.length-1;ii++){data___=data___[temp_lst[ii]]}
                        data___=data___[last_name]
                        if (temp_iitem=='received_data')data___=received_data
                      }else if(Array.isArray(temp_iitem)){
                        
                        data___=temp_iitem[0];           //获取变量地址
                        // console.log('ddddd111',data___)
                        let temp_lst=temp_iitem[1].split('.');          //拆分数组
                        let last_name=temp_lst[temp_lst.length-1];//最后一个变量的名字
                        for (let ii=0;ii<temp_lst.length-1;ii++){data___=data___[temp_lst[ii]]}
                        // console.log('ddddd2222',data___,last_name)
                        data___=data___[last_name]
                      }
                      
                      //  console.log(  '###args5###',args)
                      //  console.log('iitem',iitem)
                      if (iitem[0]=='args'){args[iitem[1]]=data___}
                      else if (iitem[0]=='kwargs'){kwargs[iitem[1]]=data___}
                      
                      // console.log(  '###args6###',args)
                    }
              let args_str='';
              if (args.length!=0){
                // console.log('errrrrrr  args',args);
              args_str='args['+args.map((value, index) => index).join('],args[')+']';}
              let kwargs_str='';
              let kwargs_key_lst=Object.keys(kwargs).map(key => key);
              for (let fjsdlakfj=0;fjsdlakfj<kwargs_key_lst.length;fjsdlakfj++){
              kwargs_str=kwargs_str+','+kwargs_key_lst[fjsdlakfj]+'='+'kwargs['+kwargs_key_lst[fjsdlakfj]+']'
              }
              // console.log(args_str,kwargs_str);
              let tttemp_str='';
              if (args_str==''&&kwargs_str!=''){tttemp_str="temp_func("+kwargs_str.substring(1, str.length)+")"}
              else{tttemp_str="temp_func("+args_str+kwargs_str+")"}
              // console.log('###args4###',args)
              // console.log("%%%%%%%%",args[0])
                // console.log('args',args)
              // eval('console.log("%%%%%%%%",args[0])')
              // console.log('eval::::',tttemp_str)
              // console.log('item:',item)
              // console.log('item.args_',item.args_)
              if (item.args_!=null)tttemp_str="temp_func("+item.args_.map((item, index) => `item.args_[${index}]`).join(',')+")"
              if (item.kwargs_!=null){
                // console.log('kwargs_',item.kwargs);
              
              tttemp_str="temp_func("+Object.keys(item.kwargs_).map(x => x+'=item.kwargs_["'+x+'"]').join(',')+")"}
              // console.log('eval::::',tttemp_str)
              // console.log('temp_func',temp_func)
              if (args!=null){for (let iiis=0;iiis<args.length;iiis++){
                // console.log(`args[${iiis}]`,args[iiis])
              }}
               if (item.timesleep!=null)setTimeout(eval(tttemp_str),item.timesleep)//如果需要则延时执行
               else{eval(tttemp_str)}//不延时直接执行
  
            }
            else if (item.type=='set_val'){
              let val1=item.val1
              let val2=item.val2
              let data___1=null;
              let temp_lst1=[]
              let data___2=null;
              let temp_lst2=[]
              if (typeof val1 === 'string'){data___1=received_data;temp_lst1=val1.split('.')}else{data___1=val1[0];temp_lst1=val1[1].split('.')}
              if (typeof val2 === 'string'){data___2=received_data;temp_lst2=val2.split('.')}else{data___2=val2[0];temp_lst2=val2[1].split('.')}
              let last_name1=temp_lst1[temp_lst1.length-1];//最后一个变量的名字
              for (let ii=0;ii<temp_lst1.length-1;ii++){data___1=data___1[temp_lst1[ii]]}
              let last_name2=temp_lst2[temp_lst2.length-1];//最后一个变量的名字
              // console.log('data:',last_name2)
              // console.log(JSON.stringify(data___2))
              // console.log(JSON.stringify(data___2[last_name2]))
              data___1[last_name1]=data___2[last_name2];
              // console.log('data___1',data___1)
              // console.log('data___1[last_name1]',data___1[last_name1])
              // console.log('data___2',data___1)
              // console.log('data___2[last_name2]',data___2[last_name2])
              if (val2=='received_data'){data___1[last_name1]=received_data}
            }
        }
      } else {
        // 请求失败，运行回调函数
       onerror(xhr.status);
      }
    };
  
    xhr.onerror = function() {
      // 网络错误，运行回调函数
      onnetworkerror();
    };
  
    // 发送请求 
        if (method.toLowerCase()=='post' ||method.toLowerCase()=='put'  ){xhr.send(JSON.stringify(body_data));}
        else{xhr.send()}
    
  };
  }

// var func=function(data1,data2,eee,ww=5,rr=2){console.log('test_func',data1,data2,eee,ww,rr)}
// var ttteeesssttt_get=request______({method:'get',url:'/V1/color'})
// ttteeesssttt_get({
//     head_data:{"limit":[1,20]},
//     //type=func   表示运行函数 func为要运行的函数    args和kwargs为类似python的args和kwargs传参
//     //            传参的值[data1,'ddd.dd']代表 值为data1[ddd][dd] 传参的值为'count'代表 服务器传递回来的值[count]
//     //type=set_val 表示进行赋值操作 因为使用的是地址 修改后也代表原变量也被修改了
//     //            'val1':[data1,'ddd.dd'],'val2':[data2,'ddd.dd'] 表示  data1[ddd][dd]=data2[ddd][dd]
//     //            'val1':[data1,'ddd.dd'],'val2':'ddd.dd' 表示  data1[ddd][dd]=服务器传递回来的值[ddd][dd]
//     execute_lst:[
//                   {
//                     'type':'func',
//                     'func':func,
//                     'args':[[data1,'ddd.dd'],
//                     [data2,'ddd.dd'],
//                     'count',
//                     ],
//                   'kwargs':{rr:[data2,'ddd.dd']},
//                   },


//                   {'type':'set_val',
//                   'val1':[data1,'ddd.dd'],
//                   'val2':[data2,'ddd.dd']
//                   }
//     ]
// })
window.__isFull = Math.abs(window.screen.height-window.document.documentElement.clientHeight) <= 17
window.onresize = function() {
	__isFull = Math.abs(window.screen.height-window.document.documentElement.clientHeight) <= 17;
}

// 阻止F11键默认事件，用HTML5全屏API代替
window.addEventListener('keydown', function (e) {
    e = e || window.event
    if (e.keyCode===122 && !__isFull) {
        e.preventDefault()
        enterFullScreen()
    }
})

// 打开浏览器全屏模式
function enterFullScreen () {
	let el = document.documentElement
	let rfs = el.requestFullScreen || el.webkitRequestFullScreen || el.mozRequestFullScreen || el.msRequestFullscreen
	if (rfs) { // typeof rfs != "undefined" && rfs
		rfs.call(el)
	}else if (typeof window.ActiveXObject !== 'undefined') {
    // for IE，这里其实就是模拟了按下键盘的F11，使浏览器全屏
		let wscript = new ActiveXObject('WScript.Shell')
		if (wscript != null) {
			wscript.SendKeys('{F11}')
		}
	}
}
 
// 退出全屏
function exitFullScreen () {
	let el = document
	let cfs = el.cancelFullScreen || el.mozCancelFullScreen || el.msExitFullscreen || el.webkitExitFullscreen || el.exitFullscreen
	if (cfs) { // typeof cfs != "undefined" && cfs
		cfs.call(el)
	} else if (typeof window.ActiveXObject !== 'undefined') {
		// for IE，这里和fullScreen相同，模拟按下F11键退出全屏
		let wscript = new ActiveXObject('WScript.Shell')
		if (wscript != null) {
			wscript.SendKeys('{F11}')
		}
	}
}

//以下调用代码根据情况自己改写
  window.set_screen=function() {
	if (__isFull) {
		exitFullScreen();
	} else {
		enterFullScreen();
	}
}
          //根据fun1返回值来执行func2 尝试max_count次数，延时时间为time_毫秒
          var ttime2=function(func1,func2,func1_lst=[],func2_lst=[],max_ccount=50,ccount=0,time_=50,){

            if (ccount==0){time_=0}
            if (ccount<max_ccount){
                        ccount=ccount+1;
                        setTimeout(function() {
                        let p = func1(...func1_lst);
                        
                        // console.log('((((p ttime2',p)
                        if (p!=false &&p!=null){
                          // console.log('((((func2_lst ttime2',func2_lst)
                          func2(...func2_lst)
                        }else{
                          ttime2(func1,func2,func1_lst,func2_lst,max_ccount,ccount,time_)
                        }
                        
                    }, time_);
                        }}
var ttime=function(ccount,idx,innerhtml,max_ccount,js_val=0){
                
    let time_=50;
    if (ccount==0){time_=0}
    
    if (ccount<max_ccount){
                ccount=ccount+1;
                setTimeout(function() {
                let p = document.getElementById(idx);
                if (p==null){ttime(ccount,idx,innerhtml,max_ccount)
                }else{
                    p.innerHTML = innerhtml; 
                    // console.log('js_val')
                    // console.log(js_val)
                    if (js_val){eval(js_val)}
                }
                
            }, time_);
                }}
// ttime__x
// 延时搜索id为idx的节点(没有搜索到会延时继续搜索，延时时间为0，50，50，50 总共尝试max_ccount)，
// 搜索到后然后修改这个节点内容为innerhtml
// 
//n表示保留几位小数
function keepTwoDecimalFull(num,n=1) {  
    if (typeof n === 'string')n=parseInt(n, 10);  
    var result = parseFloat(num);  
    if (isNaN(result)) {  
        alert('传递参数错误，请检查！');  
        return false;  
    }  
    tev=Math.pow(10, n)
    result = Math.round(num * tev) / tev;  
    var s_x = result.toString(); //将数字转换为字符串
    
    var pos_decimal = s_x.indexOf('.'); //小数点的索引值
    
  
    // 当整数时，pos_decimal=-1 自动补0  
    if (pos_decimal < 0) {  
        pos_decimal = s_x.length;  
        s_x += '.';  
    }
  
    // 当数字的长度< 小数点索引+2时，补0  
    while (s_x.length <= pos_decimal + n) {  
        s_x += '0';  
    }  
    return s_x;  
  } 